Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - [VB.NET] Inviare file attraverso singolo socket
Forum - C# / VB.NET - [VB.NET] Inviare file attraverso singolo socket

Avatar
Elix01 (Normal User)
Newbie


Messaggi: 2
Iscritto: 11/07/2016

Segnala al moderatore
Postato alle 20:09
Lunedì, 11/07/2016
Salve a tutti, mi presento: sono Elia, un ragazzo di 15 anni che programma da relativamente poco in vb.Net.
Andiamo subito al punto: ho creato un piccolo progetto per la comunicazione attraverso socket.
Mi stavo chiedendo se insieme alle stringhe è possibile inviare immagini, come ad esempio uno screenshot.
E' possibile? Sono ore che cerco online ma ancora non ho trovato nulla.. Anche solo qualche link potrebbe essere d'aiuto.

Mi spiego meglio: inviare un file è relativamente semplice, ma il vorrei creare uno streaming webcam/screen, pertanto deve essere veloce la trasmissione dati e deve specificare di che tipo è, ad esempio: "webcam|" + immagine webcam.

Ultima modifica effettuata da Elix01 il 11/07/2016 alle 20:19
PM Quote
Avatar
TheDarkJuster (Member)
Guru^2


Messaggi: 1620
Iscritto: 27/09/2013

Segnala al moderatore
Postato alle 23:22
Lunedì, 11/07/2016
Una stringa è un insieme particolare di byte, perché 0 compare solo una volta: aka fine!

Con i socket puoi inviare non solo stringhe: ogni cosa!

Tuttavia ogni protocollo ha i suoi pregi e i suoi difetti.

Tu stai usando tcp/ip, che è lento ma da la sicurezza che i dati ricevuti siano corretti e che non vengano persi.

Quello che ti serve è una comunicazione udp, che è l'esatto contrario.... e ovviamente un protocollo di trasmissione dati

PM Quote
Avatar
Thejuster (Admin)
Guru^2


Messaggi: 2308
Iscritto: 04/05/2008

Segnala al moderatore
Postato alle 23:56
Lunedì, 11/07/2016
Aggiungo in oltre, di studiarti un pò la parte che riguarda lo stream.

Normalmente per ottenere una stringa tu fai qualcosa del tipo

Codice sorgente - presumibilmente Plain Text

  1. byte[] data = Encoding.ASCII.GetBytes(stringa_ricevuta);



ottieni un array di bytes che formano la stringa.


1) Ottenere i bytes di un file

Nel tuo caso, devi prima leggere un file di testo ed ottenerne i relativi bytes

Codice sorgente - presumibilmente C# / VB.NET

  1. FileStream fs =File.OpenRead(Directory_del_file);
  2. byte[] bytes = new byte[fs.Length];
  3.  fs.Read(bytes, 0, Convert.ToInt32(fs.Length));





Una volta che hai i bytes puoi inviarli tramite socket al client.

successivamente, il client prende i bytes ricevuti e li converte in file.


Codice sorgente - presumibilmente C# / VB.NET

  1. // Apro il file per la scrittura
  2. System.IO.FileStream FileStream =    new System.IO.FileStream(Destionazione_File, System.IO.FileMode.Create,                                           System.IO.FileAccess.Write);
  3.  
  4. //Scrivi dei blocchi di bytes in questo stream
  5. //utilizzando l'array dei bytes ricavato dal server
  6. FileStream.Write(bytes , 0, bytes.Length);
  7.  
  8. // Chido lo stream
  9. FileStream.Close();



A questo punto ti ritrovi il file bello pronto ed identico a quello originale.
Nota bene.
Devi inviare i bytes e non il contenuto del file.
C'è una bella differenza tra il contenuto e la struttura di un file.
Basta un niente per danneggiare il file, ed una volta scritto risulterebbe danneggiato.
Per questo motivo serve leggere e scrivere in bytes.
Così sei sicuro che non ti perdi nemmeno un numero o che si danneggi il dump.

Questo è il sistema migliore per ottenere quello che stai cercando.



https://mire.forumfree.it/ - Mire Engine
C# UI Designer
PM Quote
Avatar
Elix01 (Normal User)
Newbie


Messaggi: 2
Iscritto: 11/07/2016

Segnala al moderatore
Postato alle 9:41
Mercoledì, 13/07/2016
Teoricamente, se volessi inviare uno screenshot, posso salvarlo in un temporaneo memorystream e inviarlo? Perché vorrei fare, come mi pare di aver gia scritto nel primo post, uno "streaming". Di conseguenza, devo inviare più immagini su un solo socket. Se ad esempio, dal mio server richiedono sia un immagine del desktop, sia un immagine della webcam, il server puo certamente inviarle in questo modo, ma come fa il client a distinguere i byte?

PM Quote
Avatar
TheDarkJuster (Member)
Guru^2


Messaggi: 1620
Iscritto: 27/09/2013

Segnala al moderatore
Postato alle 11:21
Mercoledì, 13/07/2016
Ti serve studiare un protocollo come ti dicevo.....

Fai conto che la comunicazione sia:
INIZIO FRAME (45byte)
frame
FINE FRAME
i 45 byte successivi al marcatore di inizio frame  SONO i byte di un frame (immagine di un video).

comunque scegli un formato di dati in cui i dati non dipendono dal resto delle informazioni: come ti ho già detto UDP potrebbe perdere un intero pacchetto, quindi DEVI evitare di compromettere anche ciò che è stato inviato correttamente.

PM Quote